package com.atguigu.daijia.driver.service.impl;

import com.atguigu.daijia.driver.config.TencentCloudProperties;
import com.atguigu.daijia.driver.service.CiService;
import com.atguigu.daijia.model.vo.order.TextAuditingVo;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ciModel.auditing.*;
import com.qcloud.cos.region.Region;
import lombok.RequiredArgsConstructor;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
@RequiredArgsConstructor
public class CiServiceImpl implements CiService {

    private final TencentCloudProperties tencentCloudProperties;

    /**
     * 图片审核
     * https://cloud.tencent.com/document/product/460/57227
     *
     * @param path
     * @return
     */
    @Override
    public Boolean imageAuditing(String path) {

        // 1 创建任务请求对象
        ImageAuditingRequest request = new ImageAuditingRequest();

        // 2.添加请求参数 参数详情请见 API 接口文档
        // 2.1 设置请求 bucket
        request.setBucketName(tencentCloudProperties.getBucketPrivate());
        // 2.2 设置审核策略 不传则为默认策略（预设）
        // request.setBizType("");
        // 2.3 设置 bucket 中的图片位置
        request.setObjectKey(path);

        //3 调用接口，获取任务响应对象
        COSClient client = this.getClient();
        ImageAuditingResponse response = client.imageAuditing(request);

        client.shutdown();

        // 判断审核结果，正常：0，1：违规，2：疑似违规
        return response.getPornInfo().getHitFlag().equals("0")
                && response.getAdsInfo().getHitFlag().equals("0")
                && response.getTerroristInfo().getHitFlag().equals("0")
                && response.getPoliticsInfo().getHitFlag().equals("0");
    }

    /**
     * 文本审核
     * https://cloud.tencent.com/document/product/460/56284
     * @param content
     * @return
     */
    @Override
    public TextAuditingVo textAuditing(String content) {
        TextAuditingVo textAuditingVo = new TextAuditingVo();
        // 如果没有需要审核的文本，则直接返回审核通过
        if (!StringUtils.hasText(content)) {
            textAuditingVo.setResult("0");
            return textAuditingVo;
        }

        // 1 创建任务请求对象
        TextAuditingRequest request = new TextAuditingRequest();

        // 2 添加请求参数 参数详情请见 API 接口文档
        request.setBucketName(tencentCloudProperties.getBucketPrivate());
        // 2.1 设置请求内容，文本内容的 Base64 编码
        byte[] encodeBase64 = Base64.encodeBase64(content.getBytes());
        String contentBase64 = new String(encodeBase64);
        request.getInput().setContent(contentBase64);
        // 或是腾讯 COS 中的设置对象地址，不可同时设置
        // request.getInput().setObject("1.txt");
        // 2.2 设置审核模板（可选）
        request.getConf().setDetectType("all");

        // 3 调用接口,获取任务响应对象
        COSClient client = this.getClient();
        TextAuditingResponse response = client.createAuditingTextJobs(request);
        AuditingJobsDetail detail = response.getJobsDetail();

        // 4 封装返回结果
        // 审核状态 State，值为 Submitted（已提交审核）、Success（审核成功）、Failed（审核失败）、Auditing（审核中）其中一个
        if ("Success".equals(detail.getState())) {
            // 审核成功，获取审核结果。有效值：0（审核正常），1 （判定为违规敏感文件），2（疑似敏感，建议人工复核）
            String result = detail.getResult();
            textAuditingVo.setResult(result);
            // 文本的违规关键词
            StringBuffer keywords = new StringBuffer();
            // 文本审核结果信息集合
            List<SectionInfo> sectionInfoList = detail.getSectionList();
            sectionInfoList.forEach(sectionInfo -> {
                // 场景为色情的审核结果中命中的关键词，多关键词以英文逗号分隔
                String pornInfoKeywords = sectionInfo.getPornInfo().getKeywords();
                // 场景为违法的审核结果中命中的关键词，多关键词以英文逗号分隔
                String illegalInfoKeywords = sectionInfo.getIllegalInfo().getKeywords();
                // 场景为谩骂的审核结果中命中的关键词，多关键词以英文逗号分隔
                String abuseInfoKeywords = sectionInfo.getAbuseInfo().getKeywords();
                if (StringUtils.hasText(pornInfoKeywords)) {
                    keywords.append(pornInfoKeywords).append(",");
                }
                if (StringUtils.hasText(illegalInfoKeywords)) {
                    keywords.append(illegalInfoKeywords).append(",");
                }
                if (StringUtils.hasText(abuseInfoKeywords)) {
                    keywords.append(abuseInfoKeywords);
                }
            });
            textAuditingVo.setKeywords(keywords.toString());
        }
        return textAuditingVo;
    }

    private COSClient getClient() {
        BasicCOSCredentials credentials = new BasicCOSCredentials(tencentCloudProperties.getSecretId(), tencentCloudProperties.getSecretKey());
        ClientConfig config = new ClientConfig(new Region(tencentCloudProperties.getRegion()));
        // 使用 HTTPS 协议
        config.setHttpProtocol(HttpProtocol.https);
        return new COSClient(credentials, config);
    }
}
